﻿using ExcellentProjectPlus.Aplicacion.Cuestionarios.Preguntas;
using ExcellentProjectPlus.Dominio.Cuestionarios.Entidades;
using Servicios.Cuestionarios.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using AutoMapper;
using ExcellentProjectPlus.Aplicacion.Cuestionarios.Recursos;

namespace Servicios.Cuestionarios.Controllers
{
    public class PreguntasController : ApiController
    {
        #region Propiedades
        IServicioDeGestionDePreguntas _servicioDeGestionDePreguntas;
        IServicioDeGestionDeRecursos _servicioDeGestionDeRecursos;
        #endregion

        #region Constructores
        public PreguntasController(IServicioDeGestionDePreguntas servicioDeGestionDePreguntas,

            IServicioDeGestionDeRecursos servicioDeGestionDeRecursos)
        {
            _servicioDeGestionDePreguntas = servicioDeGestionDePreguntas;
            _servicioDeGestionDeRecursos = servicioDeGestionDeRecursos;
            Mapper.CreateMap<Pregunta, PreguntaModel>();
            Mapper.CreateMap<Pregunta, PreguntaConOpcionesModel>();
            Mapper.CreateMap<Opcion, OpcionModel>();
            Mapper.CreateMap<Recurso, RecursoModel>();
        }
        #endregion

        [HttpGet]
        public IHttpActionResult Get(bool? includeDetails = false)
        {
            if (!includeDetails.Value)
                return Ok(Mapper.Map<IEnumerable<Pregunta>, IEnumerable<PreguntaModel>>(_servicioDeGestionDePreguntas.ObtenerPreguntas()));
            else
                return Ok(_servicioDeGestionDePreguntas.ObtenerPreguntasConDetalle());
        }
        [HttpGet]
        [ResponseType(typeof(PreguntaModel))]
        [Route("api/obtenerpregunta/{id}")]
        public IHttpActionResult GetPregunta(int id)
        {
            Pregunta pregunta = _servicioDeGestionDePreguntas.ObtenerPreguntaPorId(id);
            if (pregunta == null)
            {
                return NotFound();
            }
            //return Ok(Mapper.Map<Pregunta, PreguntaModel>(pregunta));
            return Ok(pregunta);
        }

        [HttpGet]
        [ResponseType(typeof(PreguntaModel))]
        [Route("api/obtenerpreguntacompleta/{id}")]
        public IHttpActionResult ObtenerPreguntaCompleta(int id)
        {
            Pregunta pregunta = _servicioDeGestionDePreguntas.ObtenerPreguntaCompletaPorId(id);
            if (pregunta == null)
            {
                return NotFound();
            }
            //return Ok(Mapper.Map<Pregunta, PreguntaModel>(pregunta));
            return Ok(pregunta);
        }

        [HttpGet]
        [Route("api/preguntas/{id}")]
        [ResponseType(typeof(Pregunta))]
        public IHttpActionResult GetPregs(int id)
        {
            Pregunta pregunta = _servicioDeGestionDePreguntas.ObtenerPreguntaPorId(id);
            if (pregunta == null)
            {
                return NotFound();
            }

            return Ok(pregunta);
        }


        //Obtener Preguntas por ID
        [HttpGet]
        [Route("api/cuestionariopreguntas/{id}")]
        [ResponseType(typeof(Pregunta))]
        public IHttpActionResult GetCuestionarioPregunta(int id)
        {
            Pregunta pregunta = _servicioDeGestionDePreguntas.ObtenerPreguntaPorId(id);
            if (pregunta == null)
            {
                return NotFound();
            }
            //pregunta.PreguntaCuestionarios = null;
            return Ok(Mapper.Map<Pregunta, PreguntaConOpcionesModel>(pregunta));
        }
        [HttpPost]
        [ResponseType(typeof(Pregunta))]
        public IHttpActionResult Post(Pregunta pregunta)
        {
            if (!ModelState.IsValid)
                return BadRequest(ModelState);

            _servicioDeGestionDePreguntas.AgregarPregunta(pregunta);

            return CreatedAtRoute("DefaultApi", new { id = pregunta.IdPregunta }, pregunta);
        }

        [HttpPost]
        [Route("api/preguntas/asignarrecursos")]
        public IHttpActionResult SaveQuestionResources(RecursoPreguntaModel recursos)
        {
            if (!ModelState.IsValid)
                return BadRequest(ModelState);

            foreach (var item in recursos.IdRecursos)
            {
                _servicioDeGestionDePreguntas.AgregarRecursoACuestionario(recursos.IdPregunta, item);
            }
            return Ok();
        }

      

        [HttpPut]
        [Route("api/preguntas/{id}")]
        [ResponseType(typeof(Pregunta))]
        public IHttpActionResult Put(int id, [FromBody]Pregunta pregunta)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != pregunta.IdPregunta)
            {
                return BadRequest();
            }

            _servicioDeGestionDePreguntas.ModificarPregunta(pregunta);

            return StatusCode(HttpStatusCode.NoContent);
        }

        [HttpDelete]
        [Route("api/preguntas/{id}")]
        [ResponseType(typeof(Pregunta))]
        
        public IHttpActionResult Delete(int id)
        {
            
            Pregunta pregunta = _servicioDeGestionDePreguntas.ObtenerPreguntaPorId(id);

            if (pregunta == null)
            {
                return NotFound();
            }

            _servicioDeGestionDePreguntas.EliminarPregunta(pregunta);

            return Ok(pregunta);
        }
        [HttpDelete]
        [Route("api/cuestionariopreguntas/eliminar/{id}")]
        [ResponseType(typeof(Pregunta))]
        public IHttpActionResult DeleteCuestPregunta(int id)
        {
            Pregunta pregunta = _servicioDeGestionDePreguntas.ObtenerPreguntaPorId(id);

            if (pregunta == null)
            {
                return NotFound();
            }

            _servicioDeGestionDePreguntas.EliminarPregunta(pregunta);

            return Ok(pregunta);
        }
        private bool PreguntaExists(int id)
        {
            return _servicioDeGestionDePreguntas.ObtenerPreguntaPorId(id) != null;
        }

    }
}